﻿using System;
using System.Collections.Generic;
using System.Linq;

namespace HCMUS_SearchService_Group2
{
    /////////////////////////////////////////////////
    /// \brief Lớp Từ Khóa Đường DAO 
    /// \author Dương Văn Phong -   0912334.
    /// \details <h3>Cung cấp hàm Lấy danh sách từ khóa Đường với chuỗi tương ứng va autocomplete</h3>
    public class StreetKeyWordDAO : KeyWordDAO, IKeyWordObjectDAO
    {
        /////////////////////////////////////////////////
        /// \brief Lấy DS StreetKeyDTO
        /// \param[in] Không.
        /// \returns  List<StreetKeyDTO>.
        /// \details <h3>Trả về danh sách tất cả các StreetKeyDTO trong Database.</h3>
        /////////////////////////////////////////////////
        public static List<StreetKeyDTO> GetAllDTOKeyWord()
        {
            List<StreetKeyDTO> lstStreetKey = new List<StreetKeyDTO>();
            var lstResultKey = from data in DataConnectionHelper.Context.TUKHOADUONGs
                               select data;
            foreach (var obj in lstResultKey)
            {
                StreetKeyDTO temp = new StreetKeyDTO();
                if (null != obj.MaDuong)
                    temp.StreetID = (int)obj.MaDuong;
                temp.StreetKeyID = obj.MaTuKhoaDuong;
                temp.StreetKeyWord = obj.TuKhoaDuong1;
                lstStreetKey.Add(temp);
            }

            return lstStreetKey;
        }
        /////////////////////////////////////////////////
        /// \brief Hàm Chuyển Đổi
        /// \param[in] List<TUKHOADUONG> 
        /// \returns List<KeyWordDTO>
        /// \details <h3>Trả về danh sách Đối tượng DTO tương ứng từ database </h3>
        public static List<KeyWordDTO> ConvertToStreetKeyDTOList(List<StreetKeyDTO> streetKeyList)
        {
            List<KeyWordDTO> lstTuKhoaTinhThanhDTO = new List<KeyWordDTO>();
            foreach (StreetKeyDTO tuKhoaDuong in streetKeyList)
            {
                /*StreetKeyDTO streetKey = new StreetKeyDTO();
                streetKey.StreetID = Convert.ToInt32(tuKhoaDuong.MaDuong);
                streetKey.StreetKeyID = Convert.ToInt32(tuKhoaDuong.MaTuKhoaDuong);
                streetKey.StreetKeyWord = tuKhoaDuong.TuKhoaDuong1;*/
                lstTuKhoaTinhThanhDTO.Add(tuKhoaDuong);
            }

            return lstTuKhoaTinhThanhDTO;
        }

        /////////////////////////////////////////////////
        /// \brief Hàm Tìm danh sách từ khóa đường với chuỗi tương ứng
        /// \param[in] string
        /// \returns List<KeyWordDTO>
        /// \details <h3>Các bước thực hiện:</h3>
        /////////////////////////////////////////////////
        public List<KeyWordDTO> Search(string strInput)
        {
            /// - Bước 1: Khởi tạo danh sách dữ liệu
            List<StreetKeyDTO> listTuKhoaDuongDTO = new List<StreetKeyDTO>();

            if (null != strInput)
            {
                strInput = strInput.Replace(@"'", @"''");

                /// - Bước 2: Truy Vấn dữ liệu
                listTuKhoaDuongDTO = (
                    from emp in SearchHelper.StreetKeys
                    where strInput.IndexOf(emp.StreetKeyWord) != -1
                    select emp).ToList();
            }

            /// \see ConvertToStreetKeyDTOList(List<TUKHOADUONG>)
            return StreetKeyWordDAO.ConvertToStreetKeyDTOList(listTuKhoaDuongDTO);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm AutoComplete Tu khoa Đường
        /// \param[in] string
        /// \returns List<KeyWordDTO>
        /// \details <h3>Tìm 10 từ khóa đường đầu tiên khi biết chuỗi con mà nó chứa</h3>
        public List<KeyWordDTO> AutoCompleteTuKhoaDuong(string strInput)
        {
            List<StreetKeyDTO> listTuKhoaDuong = new List<StreetKeyDTO>();

            if (null != strInput)
            {
                strInput = strInput.Replace(@"'", @"''");
                listTuKhoaDuong = (
                    from emp in SearchHelper.StreetKeys
                    where emp.StreetKeyWord.Contains(strInput) == true
                    select emp).Distinct().Take(10).ToList();
            }

            /// \see ConvertToStreetKeyDTOList(List<TUKHOADUONG>)
            return StreetKeyWordDAO.ConvertToStreetKeyDTOList(listTuKhoaDuong);
        }

        /////////////////////////////////////////////////
        /// \brief Hàm AutoComplete Tu khoa đường theo dịch vụ 
        /// \param[in] string
        /// \param[in] int
        /// \returns List<KeyWordDTO>
        /// \details <h3>Tìm 10 từ khóa đường đầu tiên thuộc 1 loại dịch vụ khi biết chuỗi con mà nó chứa  </h3>
        public List<KeyWordDTO> AutoCompleteTuKhoaDuongTheoDichVu(string strInput, int maDichVu)
        {
            List<StreetKeyDTO> listTuKhoaDuong = new List<StreetKeyDTO>();
            if (null != strInput)
            {
                strInput = strInput.Replace(@"'", @"''");

                listTuKhoaDuong = (from kd in SearchHelper.StreetKeys
                                   join d in SearchHelper.Streets on kd.StreetID equals d.StreetID
                                   join dl in SearchHelper.Datas on d.StreetID equals dl.MaDuong
                                   where kd.StreetKeyWord.Contains(strInput) == true && maDichVu == dl.MaDichVu
                                   select kd).Distinct().Take(5).ToList();
            }

            /// \see ConvertToStreetKeyDTOList(List<TUKHOADUONG>)
            return StreetKeyWordDAO.ConvertToStreetKeyDTOList(listTuKhoaDuong);
        }
    }
}
